823e9cf358df7d6131b8db4ddd6cb9ade4e7baf5,src/org/jgroups/protocols/UNICAST.java,UNICAST,handleDataReceived,#Address#number#number#boolean#Message#,487
Before Change
undelivered_msgs.incrementAndGet();
if(win.smallerThanNextToRemove(seqno))
sendAck(msg.getSrc(), seqno);
// message is passed up if OOB. Later, when remove() is called, we discard it. This affects ordering !
// http://jira.jboss.com/jira/browse/JGRP-377
After Change
}
}
if(send_request_for_first_seqno != null) {
sendRequestForFirstSeqno(send_request_for_first_seqno);
return;
}
byte result=win.add2(seqno, msg); // win is guaranteed to be non-null if we get here
boolean added=result > 0;
num_msgs_received++;
num_bytes_received+=msg.getLength();
if(added && !msg.isFlagSet(Message.OOB))
undelivered_msgs.incrementAndGet();
// Cannot be replaced with if(!added), see https://jira.jboss.org/jira/browse/JGRP-1043 comment 15/Sep/09 06:57 AM
// We *have* to do send the ACK, to cover the following scenario:
// - A sends #3 to B
// - B removes #3 and sends ACK(3) to A. B's next_to_remove is now 4
// - B's ACK(3) to A is dropped by the network
// - A keeps retransmitting #3 to B, until it gets an ACK(3)
// -B will never ACK #3 if the 2 lines below are commented ==> endless retransmission of A's #3 !
if(result == -1) { // only ack if seqno was < next_to_remove !
sendAck(msg.getSrc(), seqno);
}
// message is passed up if OOB. Later, when remove() is called, we discard it. This affects ordering !